import logger from '../utils/logger.js'
/**
 * 用户ID处理工具 - 专门处理JavaScript中long型数据精度丢失问题
 */

/**
 * 比较两个用户ID是否相等，处理精度丢失问题
 * @param {string|number} id1 - 第一个用户ID
 * @param {string|number} id2 - 第二个用户ID
 * @returns {boolean} - 是否相等
 */
export function compareUserIds(id1, id2) {
  if (!id1 || !id2) return false;
  
  const str1 = String(id1);
  const str2 = String(id2);
  
  // 首先尝试字符串精确比较
  if (str1 === str2) {
    return true;
  }
  
  // 如果字符串不相等，检查是否是精度丢失问题
  // 对于19位的long型数据，JavaScript可能丢失最后几位精度
  const num1 = Number(str1);
  const num2 = Number(str2);
  
  // 如果数字相差很小（小于1000），认为是同一个ID的精度丢失
  const diff = Math.abs(num1 - num2);
  if (diff < 1000) {
    logger.warn('⚠️ [UserIdUtils] 检测到用户ID精度丢失:', {
      id1: str1,
      id2: str2,
      diff: diff,
      message: '建议后端使用字符串格式传递用户ID'
    });
    return true;
  }
  
  return false;
}

/**
 * 安全地从JWT令牌中提取用户ID，避免精度丢失
 * @param {string} token - JWT令牌
 * @returns {string|null} - 用户ID字符串，失败返回null
 */
export function extractUserIdFromToken(token) {
  try {
    if (!token) return null;
    
    const tokenParts = token.split('.');
    if (tokenParts.length !== 3) return null;
    
    const payloadBase64 = tokenParts[1];
    const payloadStr = atob(payloadBase64);
    
    // 使用正则表达式提取ID，避免JSON.parse的精度丢失
    const idMatch = payloadStr.match(/"id":(\d+)/);
    if (idMatch && idMatch[1]) {
      return idMatch[1]; // 返回字符串格式
    }
    
    // 备用方案：使用JSON.parse但立即转为字符串
    const payload = JSON.parse(payloadStr);
    const userIdNum = payload.claims?.id;
    if (userIdNum) {
      logger.warn('⚠️ [UserIdUtils] 使用备用方案提取用户ID，可能存在精度丢失');
      return String(userIdNum);
    }
    
    return null;
  } catch (error) {
    logger.error('❌ [UserIdUtils] JWT令牌解析失败:', error);
    return null;
  }
}

/**
 * 获取当前登录用户的ID
 * @returns {string} - 用户ID字符串
 */
export function getCurrentUserId() {
  try {
    // 首先尝试从JWT令牌获取
    const token = localStorage.getItem('token');
    if (token) {
      const userId = extractUserIdFromToken(token);
      if (userId) {
        return userId;
      }
    }
    
    // 备选方案：从localStorage获取用户信息
    const userInfoStr = localStorage.getItem('userInfo');
    if (userInfoStr) {
      const userInfo = JSON.parse(userInfoStr);
      const userId = String(userInfo.id || '');
      if (userId) {
        return userId;
      }
    }
  } catch (error) {
    logger.error('❌ [UserIdUtils] 获取用户ID失败:', error);
  }
  
  logger.warn('⚠️ [UserIdUtils] 无法获取用户ID');
  return '';
}

/**
 * 检查指定作业是否属于当前用户
 * @param {object} homework - 作业对象
 * @returns {boolean} - 是否属于当前用户
 */
export function isMyHomework(homework) {
  if (!homework || !homework.teacherId) return false;
  
  const currentUserId = getCurrentUserId();
  if (!currentUserId) return false;
  
  return compareUserIds(homework.teacherId, currentUserId);
}

/**
 * 格式化用户ID为显示用的字符串
 * @param {string|number} userId - 用户ID
 * @returns {string} - 格式化后的字符串
 */
export function formatUserId(userId) {
  if (!userId) return '未知用户';
  
  const str = String(userId);
  
  // 如果是19位长ID，显示前4位...后4位的格式
  if (str.length >= 16) {
    return `${str.substring(0, 4)}...${str.substring(str.length - 4)}`;
  }
  
  return str;
}

/**
 * 获取当前用户的角色
 * @returns {number|null} - 角色ID (2=教师, 3=学生)
 */
export function getUserRole() {
  try {
    // 首先尝试从JWT令牌获取
    const token = localStorage.getItem('token');
    if (token) {
      const tokenParts = token.split('.');
      if (tokenParts.length === 3) {
        const payloadBase64 = tokenParts[1];
        const payloadStr = atob(payloadBase64.replace(/-/g, '+').replace(/_/g, '/'));
        
        // 使用正则表达式提取role
        const roleMatch = payloadStr.match(/"role":(\d+)/);
        if (roleMatch && roleMatch[1]) {
          const role = parseInt(roleMatch[1], 10);
          logger.log('🔑 [UserIdUtils] 从JWT获取角色:', role, role === 2 ? '(教师)' : role === 3 ? '(学生)' : '(其他)');
          return role;
        }
        
        // 备用方案：使用JSON.parse
        try {
          const payload = JSON.parse(payloadStr);
          const role = payload.claims?.role;
          if (role !== undefined) {
            logger.log('🔑 [UserIdUtils] 从JWT备用方案获取角色:', role);
            return role;
          }
        } catch (parseError) {
          logger.warn('⚠️ [UserIdUtils] JWT解析失败:', parseError);
        }
      }
    }
    
    // 备选方案：从localStorage获取用户信息
    const userInfoStr = localStorage.getItem('userInfo');
    if (userInfoStr) {
      const userInfo = JSON.parse(userInfoStr);
      if (userInfo.role !== undefined) {
        logger.log('🔑 [UserIdUtils] 从localStorage获取角色:', userInfo.role);
        return userInfo.role;
      }
    }
  } catch (error) {
    logger.error('❌ [UserIdUtils] 获取用户角色失败:', error);
  }
  
  logger.warn('⚠️ [UserIdUtils] 无法获取用户角色');
  return null;
}

/**
 * 判断当前用户是否为学生
 * @returns {boolean} - true表示学生，false表示非学生
 */
export function isStudent() {
  const role = getUserRole();
  return role === 3;
}

/**
 * 判断当前用户是否为教师
 * @returns {boolean} - true表示教师，false表示非教师
 */
export function isTeacher() {
  const role = getUserRole();
  return role === 2;
} 